<?php

namespace app\home\controller;

use app\common\controller\Home;


class Teacher extends Home
{
    // 先写所有方法都不要登录
    public $NoLogin = ['index','info'];

    public function __construct()
    {
        // 继承公共控制器
        parent::__construct();
        
        $this->SubjectModel = model('Subject.Subject');
        /* 加载TeachetModel。为下面对数据库里面的fa_subject_teacher的name字段和job字段做模糊查询做准备。换句话说，想在那个数据库操作，
        必须先得拿到这个数据库*/
        $this->TeacherModel = model('Teacher.Teacher');
        $this->CategoryModel = model('Subject.Category');
        $this->FollowModel = model('Teacher.Follow');

    }

          // 老师搜索
    public function index()
    {
        // 接收post（ajax异步）发送请求，来自fast/application/home/view/index/teacher .html
        if($this->request->isAjax())
        {
            // 有就拿，没有就分别给1，10和空
            $page = $this->request->param('page',1,'trim');
            $limit = $this->request->param('limit',10,'trim'); //limit为每页显示多少条,
            $keywords = $this->request->param('keywords','','trim');

            // 偏移量。为下面每页查询多少条准备
            $start = ($page-1)*$limit;

            // 模糊查询。根据数据库老师表fa_subject_teacher中的两个字段来查询老师，老师的名字和老师的职位（例如全栈高级工程师）
            // 符合条件是关键词不为空,组装条件去查询，就去做模糊查询
            $where = []; 
            if(!empty($keywords))
            {
                // 对课程表中的name和job字段,做模糊查询
                $where['name|job'] = ['LIKE',"%$keywords%"];
            }

            // 模糊查询完，会返回一个总条数，这时再对老师模型TeacherModel做一个查询
            $count = $this->TeacherModel->where($where)->count();

            /* 查询数据。limit($start,$limit)表示从哪里开始查，查多少条，$start就是上面定义的偏移量。因为数据库老师表fa_subject_teacher中
            没有外键id,所以这里没有连表查询*/
            $list = $this->TeacherModel
                    ->where($where)
                    ->limit($start,$limit)
                    ->select();
            
            // 组装数据 ，在查询完数据后进行
            $data = [
                'count' => $count,
                'list' => $list
            ];

            // 接下来，把打印所看到的结果，从哪里发送过来就扔回去哪里。
            // 但是扔回去之前也要做一个条件判断，以确保扔回去的是正确的结果

            // 判断是否成功返回
            if($list)
            {
               //成功返回
               $this->success('返回列表',null,$data); 
               exit;
            }else
            {
                //返回失败
                $this->error('暂无数据',null,$data);
                exit; 
            }

            /* 到这里ajax的返回值就已经有了，这时回到发送过来的地方fast/application/home/view/index/subject.html，里面的console.log(result)
            把结果作为返回值给到它*/

            // 一个问题：在讲邮件发送时讲过，这两个方法会根据语境自动转换：如果正常请求，会跳转;如果是Ajax请求，会自动返回json结果



        }


        return $this->view->fetch();
    }
    

     //老师详情界面。这个方法这执行完就传到同路径下的info
    public function info()
    {
        // 接收teacherid，来自老师页面application/home/view/teacher/index.html
        $teacherid = $this->request->param('teacherid', 0, 'trim');
        


        // // 写代码时，这里可以var_dump($teacherid);exit;看一下是否接收到teacherid

        //查询老师的信息
        $teacher = $this->TeacherModel->find($teacherid);

        if(!$teacher)
        {
            $this->error('老师信息不存在');
            exit;
        }

        // 因为这里设定老师详情页info是不要登录就可以进来的，所以在这里先给判断，判断是否登录
         //获取用户是否登录的信息

        //  没有登陆
        $login = $this->IsLogin(false);

        // 如果没有登录
        if ($login) {

            // 查询条件
            $where = [
                'teacherid' => $teacherid,
                'busid' => $login['id']
            ];

            //查询是否有关注过这个老师
            $check = $this->FollowModel->where($where)->find();

            //增加自定义属性。如果有关注到就true,给个属性，如果没有关注到就false,不增加这个属性
            $teacher['follow'] = $check ? true : false;
        } else {
            $teacher['follow'] = false;
        }

        // toArray()表示把对象转化为数组，作用是可以在打印出来的时候看的一目了然
        // var_dump($teacher->toArray());
        // die;

        //判断是否有ajax请求，来自application/home/home/view/teacher/info.html的<script>  await POST({}) </script>
        if($this->request->isAjax())
        {
            $page = $this->request->param('page', 1, 'trim'); //接收分页
            $limit = $this->request->param('limit', 10, 'trim'); //接收一页展示多少条数据
            $keywords = $this->request->param('keywords', '', 'trim'); //接收搜索的关键词

            //偏移量
            $start = ($page-1)*$limit;

            // 组装条件去查询

            // 条件是查询为当前老师的
            $where = ['teacherid' => $teacherid];

            if(!empty($keywords))
            {
                $where['title'] = ['LIKE', "%$keywords%"];
            }

            //查询数据总条数
            $count = $this->SubjectModel->where($where)->count();

            //查询数据
            $list = $this->SubjectModel

                ->with(['category']) //查找分类的连表查询，只用写'category（）方法'，就不用tercher老师的
                ->where($where)
                ->limit($start, $limit)
                ->select();

            //返回结果给到info.html那里 
             $data = [
                'count' => $count,
                'list' => $list
            ];

            // 返回情况
                if($list)
            {
                //成功返回
                $this->success('返回列表', null, $data);
                exit;
            }else
            {
                //失败返回
                $this->error('暂无数据', null, $data);
                exit;
            }
        

        }

        // 老师的数据就正常返回
        $this->assign([
            'teacher' => $teacher
        ]);

        return $this->view->fetch();
    }
        



    //老师关注和取消关注
    public function follow()
    {
        /* 接收来自application/home/view/teacher/info.html的关注老师按钮的a链接传过来的['teacherid' => $teacher['id']] */
        $teacherid = $this->request->param('teacherid', 0, 'trim');
        
        //查询老师的信息。因为要确保这个关注的老师是存在
        $teacher = $this->TeacherModel->find($teacherid); 

        if(!$teacher)
        {
            $this->error('老师信息不存在');
            exit;
        }

        //判断这个人是否关注过
        $where = [
            'teacherid' => $teacherid,
            'busid' => $this->view->AutoLogin['id']
        ];

        // 查询是否有这个记录
        $check = $this->FollowModel->where($where)->find();

        // var_dump($check->toArray());
        // die;
        // 点击去取消关注，可以看到之前关注的那条记录，证明之前有关注过，则要走到取消关注这里

        // 把这两个值给初始化
        $result = $msg = '';

        //如果能找出记录就说明有关注过，取消关注 删除语句
        if($check)
        {

            // 一个很好的办法做删除，既然然查询到这条记录，则存在id，根据id把这条记录给删除
            // destroy()方法是thinkphp里面一个删除方法，根据主键id来删除
            // 这里就关注了记录赋值给$check，然后删除时就把这个id放到destroy()，完成删除 
            $result = $this->FollowModel->destroy($check['id']);
            
            $msg = '取消关注成功';
        }else
        {
            //没找到记录，没有关注过，关注 插入语句
            //组装数据
            $data = [
                'teacherid' => $teacherid,
                'busid' => $this->view->AutoLogin['id']
            ];

            // validate是验证器，是利用命令php think make:validate commom/Teacher/Follow创建
            $result = $this->FollowModel->validate('common/Teacher/Follow')->save($data);

            $msg = '关注成功';
        }

        if($result === FALSE)
        {
            // getError()表示获得错误，error（）表示通过错误显示的方法显示出来
            $this->error($this->FollowModel->getError());
            exit;
        }else
        {
            $this->success($msg);
            exit;
        }

    }

}
